package br.com.javamagazine.leilaojm.managedbean;

import java.io.Serializable;
import java.util.*;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.*;

import org.primefaces.model.chart.*;

import br.com.javamagazine.leilaojm.domain.Anuncio;
import br.com.javamagazine.leilaojm.ejb.AnuncioService;

@Named
@RequestScoped
public class GraficoBean implements Serializable {

	private static final long serialVersionUID = 6759535696571484384L;

	@EJB
	private AnuncioService anuncioService;

	@Inject
	private ModeloBean modeloBean;

	private BarChartModel graficoNumeroAnuncios;
	private Integer qtdMaximaAnuncios;

	public void criaGraficoLinha() {
		graficoNumeroAnuncios = preencheDadosSeries();
		graficoNumeroAnuncios.setTitle("Número de Anúncios para "
				+ modeloBean.getModelo().getNome() + " por ano do modelo");
		graficoNumeroAnuncios.setLegendPosition("e");
		graficoNumeroAnuncios.setShowPointLabels(true);
		graficoNumeroAnuncios.getAxes().put(AxisType.X,
				new CategoryAxis("Ano do Modelo"));
		Axis yAxis = graficoNumeroAnuncios.getAxis(AxisType.Y);
		yAxis.setMin(0);
		yAxis.setMax(qtdMaximaAnuncios + 2);
		yAxis.setLabel("Quantidade");
	}

	private BarChartModel preencheDadosSeries() {
		BarChartModel model = new BarChartModel();
		BarChartSeries series1 = new BarChartSeries();
		List<Anuncio> anuncios = anuncioService
				.listaAnunciosDoModelo(modeloBean.getModelo().getId());
		Map<Integer, Integer> mapaAnunciosPorAno = agrupaNumeroAnunciosPorAnoModelo(anuncios);
		series1.setLabel(modeloBean.getModelo().getNome());
		Set<Integer> chaves = mapaAnunciosPorAno.keySet();
		for (Integer chave : chaves) {
			series1.set(chave, mapaAnunciosPorAno.get(chave));
		}
		model.addSeries(series1);

		return model;
	}

	private Map<Integer, Integer> agrupaNumeroAnunciosPorAnoModelo(
			List<Anuncio> anuncios) {
		Map<Integer, Integer> anunciosPorAnoModelo = new HashMap<Integer, Integer>();
		qtdMaximaAnuncios = 1;
		for (Anuncio anuncio : anuncios) {
			if (anunciosPorAnoModelo.containsKey(anuncio.getAnoModelo())) {
				Integer qtdAnuncios = anunciosPorAnoModelo.get(anuncio
						.getAnoModelo());
				anunciosPorAnoModelo.put(anuncio.getAnoModelo(), ++qtdAnuncios);
				if (qtdAnuncios > qtdMaximaAnuncios) {
					qtdMaximaAnuncios++;
				}
			} else {
				anunciosPorAnoModelo.put(anuncio.getAnoModelo(), 1);
			}
		}

		return anunciosPorAnoModelo;
	}

	public BarChartModel getGraficoNumeroAnuncios() {
		return graficoNumeroAnuncios;
	}

	public void setGraficoNumeroAnuncios(BarChartModel graficoNumeroAnuncios) {
		this.graficoNumeroAnuncios = graficoNumeroAnuncios;
	}

}
